設定 AVCaptureMetadataOutput
實例化一個 AVCaptureMetadataOutput 物件
let metaDataOutput = AVCaptureMetadataOutput()
透過 AVCaptureMetadataOutput 輸出資料
判斷是否可以將 metaDataOutput 輸出到 captureSession
f (captureSession?.canAddOutput(metaDataOutput) ?? false) {
captureSession?.addOutput(metaDataOutput)
// 設定可以處理哪些類型的條碼
metaDataOutput.metadataObjectTypes = [.qr, .ean8, .ean13, .pdf417]
scanQRCodeRectOfInterest()
// 限制可掃描範圍
metaDataOutput.rectOfInterest = CGRect(x: scanQRcodePath.bounds.minY/superViewBounds.height, y: scanQRcodePath.bounds.minX/superViewBounds.width, width: scanQRcodePath.bounds.height/superViewBounds.height, height: scanQRcodePath.bounds.width/superViewBounds.width)
// 設定代理 在主執行緒裡重新整理
metaDataOutput.setMetadataObjectsDelegate(self, queue: DispatchQueue.main) //執行處理 QRCode
}
lse {
return
}
``
需注意的是 rectOfInterest 的部分:
![](https://i.imgur.com/16OqaYm.png)
因此在 CGRect 裡,會是以這樣的方式呈現
CGRect(
x: 可掃描區域的 Y / 螢幕的高,
y: 可掃描區域的 X / 螢幕的寬,
width: 可掃描區域的 height / 螢幕的高,
height: 可掃描區域的 width/ 螢幕的寬
)
```
用 AVCaptureVideoPreviewLayer 來呈現 AVCaptureSession 的資料
/ 顯示來自相機設備的視頻的核心動畫層
aptureVideoPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession!)
/ 在邊界內顯示的視覺內容
aptureVideoPreviewLayer.videoGravity = .resizeAspectFill
aptureVideoPreviewLayer.frame = scanQRCodeView.layer.frame
canQRCodeView.layer.addSublayer(captureVideoPreviewLayer)
/ 開始偵測與掃描
aptureSession?.startRunning()
``
videoGravity 默認值為 resizeAspect
* resizeAspect:
保留其縱橫比並使其適合圖層的邊界
* resizeAspectFill:
保留其縱橫比並填充圖層的邊界
* resize:
拉伸以填充圖層的邊界
明天將會繼續介紹 AVCaptureMetadataOutputObjectsDelegate 裡的設定
GitHub - AVCaptureVideoPreviewLayerDemo